/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * DialogoReporteGastosReencauches.java
 *
 * Created on 06-mar-2013, 14:44:01
 */
package com.camachosanchez.gui;

import com.camachosanchez.bean.ControlReencauche;
import com.camachosanchez.bean.DetalleControlReencauche;
import com.camachosanchez.reportes.ReporteReencauches;
import com.camachosanchez.reportes.bean.GastosReencauche;
import com.camachosanchez.reportes.bean.GastosReencaucheDetalle;
import com.camachosanchez.reportes.nuevos.NuevoReporteReencauche;
import com.camachosanchez.util.GUIUtil;
import com.camachosanchez.util.JPAUtil;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import javax.persistence.Query;

/**
 *
 * @author Rolando
 */
public class DialogoReporteGastosReencauches extends javax.swing.JDialog {

    /** Creates new form DialogoReporteGastosReencauches */
    public DialogoReporteGastosReencauches(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        dateInicio.setDate(new Date());
        dateFin.setDate(new Date());
        setSize(380, 150);
        setLocationRelativeTo(null);
        GUIUtil.addEscapeKey(this);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        pnlContenedor = new javax.swing.JPanel();
        btnMensaje = new javax.swing.JLabel();
        pnlFechas = new javax.swing.JPanel();
        lblInicio = new javax.swing.JLabel();
        dateInicio = new com.toedter.calendar.JDateChooser();
        lblFin = new javax.swing.JLabel();
        dateFin = new com.toedter.calendar.JDateChooser();
        jToolBar1 = new javax.swing.JToolBar();
        jPanel1 = new javax.swing.JPanel();
        btnGenerarReporte = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle(".:: Gastos en Reencauches ::.");
        setBackground(new java.awt.Color(231, 239, 247));
        setResizable(false);

        pnlContenedor.setBackground(new java.awt.Color(231, 239, 247));
        pnlContenedor.setLayout(new java.awt.GridLayout(2, 1, 4, 4));

        btnMensaje.setText("<html>Seleccione un intervalo de fechas para ver los detalles de gastos asociados a <u>reencauches</u>.");
        btnMensaje.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 8, 0, 0));
        pnlContenedor.add(btnMensaje);

        pnlFechas.setOpaque(false);

        lblInicio.setText("Inicio:");
        pnlFechas.add(lblInicio);

        dateInicio.setDateFormatString("dd/MM/yyyy");
        dateInicio.setMaxSelectableDate(new Date());
        dateInicio.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                dateInicioPropertyChange(evt);
            }
        });
        pnlFechas.add(dateInicio);

        lblFin.setText("Fin:");
        pnlFechas.add(lblFin);

        dateFin.setDateFormatString("dd/MM/yyyy");
        dateFin.setMaxSelectableDate(new Date());
        pnlFechas.add(dateFin);

        pnlContenedor.add(pnlFechas);

        getContentPane().add(pnlContenedor, java.awt.BorderLayout.CENTER);

        jToolBar1.setBackground(new java.awt.Color(255, 255, 255));
        jToolBar1.setFloatable(false);
        jToolBar1.setRollover(true);
        jToolBar1.setMinimumSize(new java.awt.Dimension(63, 25));
        jToolBar1.setPreferredSize(new java.awt.Dimension(63, 30));

        jPanel1.setBackground(new java.awt.Color(255, 255, 255));
        jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jPanel1.setMinimumSize(new java.awt.Dimension(69, 25));
        jPanel1.setPreferredSize(new java.awt.Dimension(383, 25));
        jPanel1.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT, 2, 2));

        btnGenerarReporte.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/pdf.png"))); // NOI18N
        btnGenerarReporte.setText("Imprimir");
        btnGenerarReporte.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        btnGenerarReporte.setContentAreaFilled(false);
        btnGenerarReporte.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnGenerarReporteActionPerformed(evt);
            }
        });
        jPanel1.add(btnGenerarReporte);

        jToolBar1.add(jPanel1);

        getContentPane().add(jToolBar1, java.awt.BorderLayout.PAGE_START);

        pack();
    }// </editor-fold>//GEN-END:initComponents

private void dateInicioPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_dateInicioPropertyChange
// TODO add your handling code here:
    if (evt.getPropertyName().compareTo("date") == 0) {
        dateFin.setMinSelectableDate(dateInicio.getDate());
    }
}//GEN-LAST:event_dateInicioPropertyChange

    private List<ControlReencauche> getControlReencauche(List<DetalleControlReencauche> lista) {
        List<ControlReencauche> controles = new ArrayList<ControlReencauche>();
        if (!lista.isEmpty()) {
            Integer id = lista.get(0).getIdControlReencauche().getId();
            DetalleControlReencauche temp = lista.get(0);
            for (DetalleControlReencauche item : lista) {
                if (!id.equals(item.getIdControlReencauche().getId())) {
                    ControlReencauche cotrol = temp.getIdControlReencauche();
                    controles.add(cotrol);
                }
                id = item.getIdControlReencauche().getId();
                temp = item;
            }
            ControlReencauche cotrol = temp.getIdControlReencauche();
            controles.add(cotrol);
        }
        return controles;
    }

    private List<ControlReencauche> obtenerListaReencauches(Date fechaIni, Date fechaFin) {
        java.sql.Date sqlFechaIni = new java.sql.Date(fechaIni.getTime());
        java.sql.Date sqlFechaFin = new java.sql.Date(fechaFin.getTime());
        try {
            Query q1 = JPAUtil.getEntityManagerFactory().createEntityManager().createQuery("SELECT D FROM DetalleControlReencauche D"
                    + " WHERE D.fechaRecepcion IS NOT NULL AND D.fechaRecepcion <= :fechaFin AND D.fechaRecepcion >= :fechaIni AND D.estado=1"
                    + " ORDER BY D.idControlReencauche.id, D.fechaRecepcion");
            q1.setParameter("fechaIni", sqlFechaIni);
            q1.setParameter("fechaFin", sqlFechaFin);
            List<DetalleControlReencauche> lista = q1.getResultList();
            return getControlReencauche(lista);
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
        return null;
    }

private void btnGenerarReporteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGenerarReporteActionPerformed
// TODO add your handling code here:
//    final DialogoCargando dlg = new DialogoCargando(Principal.getInstance(), true);
//    Thread hilo = new Thread() {
//
//        @Override
//        public void run() {
    try {
        Calendar cal = Calendar.getInstance();
        cal.setTime(dateInicio.getDate());
        Calendar fechaIni = new GregorianCalendar(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH));
        cal.setTime(dateFin.getDate());
        Calendar fechaFin = new GregorianCalendar(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH));
        GastosReencauche gastos = new GastosReencauche();
        gastos.setFechaDesde(GUIUtil.convertirFechaDDMMYYY(fechaIni.getTime()));
        gastos.setFechaHasta(GUIUtil.convertirFechaDDMMYYY(fechaFin.getTime()));
        List<ControlReencauche> datos = obtenerListaReencauches(fechaIni.getTime(), fechaFin.getTime());
        List<GastosReencaucheDetalle> detalles = new ArrayList<GastosReencaucheDetalle>();
        Integer totalRecepcionados = 0;
        Integer totalNoRecepcionados = 0;
        Integer totalEnGarantia = 0;
        Double total = 0d;
        if (datos != null) {
            String fecha = "";
            String distribuidor = "";
            String guiaRemision = "";
            for (ControlReencauche reencauche : datos) {
                GastosReencaucheDetalle gs = new GastosReencaucheDetalle();
                fecha = (reencauche.getFechaEnvio() == null) ? "" : (GUIUtil.convertirFechaDDMMYYY(reencauche.getFechaEnvio()));
                distribuidor = (reencauche.getIdDistribuidorNeumaticos() == null) ? "" : reencauche.getIdDistribuidorNeumaticos().getNombre();
                guiaRemision = (reencauche.getNumGuiaRemision() == null) ? "" : reencauche.getNumGuiaRemision();
                gs.setFechaEnvio(fecha);
                gs.setDistribuidor(distribuidor);
                gs.setGuiaRemision(guiaRemision);
                detalles.add(gs);
                List<DetalleControlReencauche> listaNeumaticos = reencauche.getDetalleControlReencaucheList();
                List<String[]> dtDetalles = new ArrayList<String[]>();
                Double subTotal = 0d;
                for (DetalleControlReencauche item : listaNeumaticos) {
                    if (item.getEstado()) {//si no ha sido cancelado
                        if (item.getFechaRecepcion() != null) { //si ya fueron recepcionados en una fecha
                            totalRecepcionados++;
                            subTotal += (item.getPrecio() == null) ? 0 : item.getPrecio();
                        } else {
                            totalNoRecepcionados++;
                        }
                        String[] dtlNeumaticos = new String[7];
                        dtlNeumaticos[0] = (item.getNumFactura() == null) ? "" : item.getNumFactura();
                        dtlNeumaticos[1] = (item.getFechaRecepcion() == null) ? "" : GUIUtil.convertirFechaDDMMYYY(item.getFechaRecepcion());
                        dtlNeumaticos[2] = (item.getIdNeumatico() == null) ? "" : item.getIdNeumatico().getCodigo();
                        dtlNeumaticos[3] = (item.getIdNeumatico() == null) ? "" : item.getIdNeumatico().getIdMarca().getNombre();
                        dtlNeumaticos[4] = (item.getIdNuevoTipoBanda() == null) ? "" : item.getIdNuevoTipoBanda().getNombre().trim();
                        dtlNeumaticos[5] = (item.getPrecio() == null) ? "" : item.getPrecio() + "";
                        if (item.getPorGarantia()) {
                            dtlNeumaticos[6] = "X";
                            totalEnGarantia++;
                        } else {
                            dtlNeumaticos[6] = "";
                        }
                        dtDetalles.add(dtlNeumaticos);
                    }
                }
                gs.setDetalles(dtDetalles);
                gs.setSubtotal(subTotal);
                total += subTotal;
            }
        }
        gastos.setDetalles(detalles);
        gastos.setNeumaticosEnviados(totalRecepcionados + totalNoRecepcionados);
        gastos.setNeumaticosEnviadosGarantia(totalEnGarantia);
        gastos.setNeumaticosNoRecibidos(totalNoRecepcionados);
        gastos.setNeumaticosRecibidos(totalRecepcionados);
        gastos.setTotal(total);
        
        NuevoReporteReencauche reporte = new NuevoReporteReencauche();
        reporte.generarReporte(gastos);
        /*
        try {
            Impresor impresor = new Impresor(gastos);
            Principal.getInstance().getEscritorio().add(impresor);
            impresor.setVisible(true);
            impresor.setMaximum(true);
        } catch (Exception e) {
            e.printStackTrace();
        }*/

//        ReporteReencauches reporteR = new ReporteReencauches();
//        reporteR.generarReporte(fechaIni.getTime(), fechaFin.getTime());
    } catch (Exception ex) {
        ex.printStackTrace();
//        dlg.dispose();
    }
//        }
//    };
//    hilo.start();
//    dlg.setVisible(true);
}//GEN-LAST:event_btnGenerarReporteActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnGenerarReporte;
    private javax.swing.JLabel btnMensaje;
    private com.toedter.calendar.JDateChooser dateFin;
    private com.toedter.calendar.JDateChooser dateInicio;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JToolBar jToolBar1;
    private javax.swing.JLabel lblFin;
    private javax.swing.JLabel lblInicio;
    private javax.swing.JPanel pnlContenedor;
    private javax.swing.JPanel pnlFechas;
    // End of variables declaration//GEN-END:variables
}
